package org.zjx.util;

import lombok.SneakyThrows;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class FileUtil {

    // 保存 BufferedImage 到文件，支持 PNG 和 JPEG 格式
    public static void saveImage(BufferedImage image, String filePath) {
        // 创建文件输出流
        File file = new File(filePath);
        String extension = getFileExtension(filePath).toLowerCase();

        try {
            // 根据文件扩展名选择合适的格式
            if ("png".equals(extension)) {
                ImageIO.write(image, "PNG", file);
            } else if ("jpg".equals(extension) || "jpeg".equals(extension)) {
                ImageIO.write(image, "JPEG", file);
            } else {
                throw new IllegalArgumentException("Unsupported image format: " + extension);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    // 从文件读取 BufferedImage
    @SneakyThrows
    public static BufferedImage loadImage(String filePath) {
        BufferedImage image = ImageIO.read(new File(filePath));
        // 创建一个新的 BufferedImage，类型为 TYPE_INT_ARGB，用于支持透明度
        BufferedImage argbImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_ARGB);

        // 使用 Graphics2D 将 TYPE_INT_RGB 图像的像素数据绘制到新的 TYPE_INT_ARGB 图像上
        Graphics2D g2d = argbImage.createGraphics();
        g2d.drawImage(image, 0, 0, null);
        g2d.dispose();

        return argbImage;
    }

    // 保存文本内容到文件
    public static void saveFile(String content, String filePath) throws IOException {
        Path path = Paths.get(filePath);
        Files.write(path, content.getBytes());
    }

    // 读取文件内容为字符串
    public static String readFile(String filePath) throws IOException {
        Path path = Paths.get(filePath);
        return new String(Files.readAllBytes(path));
    }

    // 获取文件扩展名
    private static String getFileExtension(String filePath) {
        int dotIndex = filePath.lastIndexOf('.');
        if (dotIndex == -1) {
            return "";
        }
        return filePath.substring(dotIndex + 1);
    }

    /**
     * 检查指定路径的文件是否存在
     * @param filePath 文件路径
     * @return 如果文件存在返回 true，否则返回 false
     */
    public static boolean fileExists(String filePath) {
        File file = new File(filePath);
        return file.exists() && file.isFile();
    }

    //检查文件是否可以被访问（未被占用）
    public static boolean isFileLocked(File file) {
        try {
            RandomAccessFile stream = new RandomAccessFile(file, "rw");
            stream.close();
            return false;  // 文件没有被占用
        } catch (IOException e) {
            return true;   // 文件被占用
        }
    }

}
